
#include <utility>
#include <iostream>
#include <string>
using namespace std;
template <typename F, typename T1, typename T2>
// 转发
void flip(F f, T1 &&t1, T2 &&t2)
{
    f(std::forward<T2>(t2), std::forward<T1>(t1));
}
void g(int &&i, int &j)
{
    cout << i << " " << j << endl;
}
// 重载
template <typename T>
void f_1(T &) { cout << "f_1" << endl; }
template <typename T>
void f_1(T *) { cout << "f_2" << endl; }
// 可变参数模板
void f_2() {}
template <typename T1, typename... T>
void f_2(T1 first, T... arg)
{
    cout << first << " " << sizeof...(arg) << endl;
    f_2(arg...);
}
// template <>
// void f_1(string &) { cout << "f_3" << endl; }
int main()
{
    string a = "hello";
    int i = 10;
    // flip(g, i, 42);
    f_1(a);
    // f_1(&i);
    // f_2(a, i, "fjdal", 79);
}